import os
import sys
import logging
import warnings
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler, MinMaxScaler
sys.path.append(os.path.dirname(os.path.abspath("../src/preprocessing.py")))
logging.basicConfig(filename='../logs/logs_file.log', level=logging.DEBUG,
format='%(asctime)s %(levelname)-8s %(message)s',
datefmt='%Y-%m-%d %H:%M:%S')
logging.getLogger("matplotlib").setLevel(logging.WARNING)
import preprocessing
from pandas_profiling import ProfileReport
logging.debug('Успешный импорт библиотек')
color=sns.color_palette()
data_path = "../data/heart.csv"
report_dir = "../reports/"
warnings.filterwarnings('ignore')
%load_ext autoreload
%autoreload 2
logging.debug('Успешное объявление вспомогательных переменных')
data = pd.read_csv(data_path)
print(data.shape)
data.head()
data.info()
data.describe()
# Удаляем дубликаты
print("До удаления", data.shape)
data = data.drop_duplicates()
print("После удаления", data.shape)
logging.debug('Удаляем дубликаты')
# Создадим обзорный отчет и сохраним его в папке с отчетами
profile = ProfileReport(data, title='Отчет', explorative=True)
profile.to_file(report_dir+"Отчет по факторам.html");
logging.debug('Создаем отчет Pandas Profile')
profile
logging.debug('Начинаем анализ для отчета')
fig, ax=plt.subplots(1, 2, figsize = (14,5))
sns.countplot(data=data, x='target', ax=ax[0], palette='Set1')
ax[0].set_xlabel("Кол-во болезней \n [0]->Нет [1]->Да")
ax[0].set_ylabel("Кол-во")
ax[0].set_title("Кол-во наблюдений")
data['target'].value_counts().plot.pie(explode=[0.1,0.0], autopct='%1.1f%%', ax=ax[1], shadow=True, cmap='Blues')
plt.title("Целевая переменная (болезнь сердца)");
fig, ax=plt.subplots(1,2,figsize=(14,5))
sns.countplot(x='sex',data=data, hue='target', palette='Set1', ax=ax[0])
ax[0].set_xlabel("0 ->Женщины , 1 ->Мужчины")
data.sex.value_counts().plot.pie(ax=ax[1], autopct='%1.1f%%', shadow=True, explode=[0.1,0], cmap='Blues')
ax[1].set_title("0 ->Женщины , 1 ->Мужчины");
fig,ax=plt.subplots(1,2,figsize=(14,5))
sns.countplot(x='fbs',data=data,hue='target',palette='Set1', ax=ax[0])
ax[0].set_xlabel("0-> Меньше 120 , 1-> Больше 120", size=12)
data.fbs.value_counts().plot.pie(ax=ax[1],autopct='%1.1f%%',shadow=True, explode=[0.1,0], cmap='Blues')
ax[1].set_title("0 -> Меньше 120 , 1-> Больше 120", size=12);
fig,ax=plt.subplots(1,2,figsize=(14,5))
sns.countplot(x='restecg', data=data, hue='target', palette='Set1', ax=ax[0])
ax[0].set_xlabel("Электрокардиограмма в покое",size=12)
data.restecg.value_counts().plot.pie(ax=ax[1],autopct='%1.1f%%',shadow=True, explode=[0.005,0.05,0.05],cmap='Blues')
ax[1].set_title("Электрокардиограмма в покое",size=12);
fig,ax=plt.subplots(1, 2, figsize=(14,5))
sns.countplot(x='slope', data=data, hue='target', palette='Set1', ax=ax[0])
ax[0].set_xlabel("Пик нагрузки ST сегмент", size=12)
data.slope.value_counts().plot.pie(ax=ax[1], autopct='%1.1f%%', shadow=True, explode=[0.005,0.05,0.05], cmap='Blues')
ax[1].set_title("Пик нагрузки ST сегмент", size=12);
fig,ax=plt.subplots(1, 2, figsize=(14,5))
sns.countplot(x='ca', data=data, hue='target', palette='Set1', ax=ax[0])
ax[0].set_xlabel("Количество крупных сосудов", size=12)
data.ca.value_counts().plot.pie(ax=ax[1], autopct='%1.1f%%', shadow=True, cmap='Blues')
ax[1].set_title("Количество крупных сосудов", size=12);
fig,ax=plt.subplots(1, 2, figsize=(14,5))
sns.countplot(x='cp', data=data, hue='target', palette='Set1', ax=ax[0])
ax[0].set_xlabel("Грудная боль")
data.cp.value_counts().plot.pie(ax=ax[1], autopct='%1.1f%%', explode=[0.01,0.01,0.01,0.01], shadow=True, cmap='Blues')
ax[1].set_title("Грудная боль");
fig,ax=plt.subplots(1, 3, figsize=(14,6))
sns.boxplot(y='trestbps', data=data, x='sex', hue='target', palette='Set1', ax=ax[0])
ax[0].set_title("Давление V/S Пол")
sns.violinplot(y='trestbps', data=data, x='exang', hue='target', ax=ax[1], palette='Set1')
ax[1].set_title("Давление V/S Стенокардия")
sns.swarmplot(y='trestbps', data=data, x='ca', hue='target', ax=ax[2], palette='Set1')
ax[2].set_title("Trestbps V/S Главный сосуд");
fig,ax=plt.subplots(1, 3, figsize=(14,6))
sns.boxplot(y='chol', data=data, x='sex', hue='target', palette='Set1', ax=ax[0])
ax[0].set_title("Холестерин V/S Пол")
sns.boxplot(y='chol', data=data, x='cp', hue='target', ax=ax[1], palette='Set1')
ax[1].set_title("Холестерин V/S Грудная боль")
sns.swarmplot(y='chol', data=data, x='thal', hue='target', ax=ax[2], palette='Set1')
ax[2].set_title("Холестерин V/S Thal");
fig,ax=plt.subplots(1, 3, figsize=(14,6))
sns.boxplot(y='oldpeak', data=data, x='sex', hue='target', palette='Set1',ax=ax[0])
ax[0].set_title("Депрессия V/S Пол")
sns.boxplot(y='oldpeak', data=data, x='cp', hue='target', ax=ax[1], palette='Set1')
ax[1].set_title("Депрессия V/S Грудная боль")
sns.swarmplot(y='oldpeak', data=data, x='thal',hue='target', ax=ax[2], palette='Set1')
ax[2].set_title("Депрессия V/S Thal");
fig,ax=plt.subplots(4,3,figsize=(15,15))
for i in range(12):
plt.subplot(4,3,i+1)
sns.distplot(data.iloc[:,i], kde=True, color='blue')
corr = data.corr()
mask = np.triu(np.ones_like(corr, dtype=bool))
f, ax = plt.subplots(figsize=(11, 9))
cmap = sns.diverging_palette(230, 20, as_cmap=True)
sns.heatmap(corr, mask=mask, cmap=cmap, vmax=.3, center=0,
square=True, linewidths=.5, cbar_kws={"shrink": .5});
!jupyter nbconvert --to html EDA.ipynb
! mv EDA.html ../reports/
logging.debug('Заканчиваем отчет и сохраняем в формате html')
print("Размер до предобработки: ", data.shape)
data = preprocessing.preprocessing(data)
print("Размер после предобработки: ", data.shape)